package com.disdr.utils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class 印章抠图 {

    private static int minX = 10000;
    private static int maxX = 0;
    private static int minY = 10000;
    private static int maxY = 0;

    public static void main(String[] args) throws Exception {

        //背景图片（默认是黑色）
        //BufferedImage bg = new BufferedImage(1700, 800, BufferedImage.TYPE_INT_RGB);
        BufferedImage bg = ImageIO.read(new File("D:\\user\\Desktop\\收据1.jpg"));
        Graphics2D g2 = (Graphics2D) bg.getGraphics();
        g2.setColor(Color.RED); // 设置背景颜色
        g2.fillRect(0, 0, 1600, 700);// 填充整张图片(其实就是设置背景颜色)

        File file = new File("D:\\user\\Desktop\\杨林.jpg");
        BufferedImage bi = ImageIO.read(file);
        印章抠图(bg,200,130,1D,"诚德冷链");

        // 保存图片 JPEG表示保存格式
        ImageIO.write(bg, "jpg", new FileOutputStream("D:\\user\\Desktop\\抠图.jpg"));
    }

    /**
     * 黑色签名
     * @param bg
     * @param 坐标X
     * @param 坐标Y
     * @param 缩放比例
     * @throws IOException
     */
    public static void 印章抠图(BufferedImage bg,Integer 坐标X,Integer 坐标Y,Double 缩放比例,String name) throws IOException {
        File file = new File("src\\main\\resources\\templates\\印章\\"+name+".png");
        if(!file.exists()){
            file = new File("src\\main\\resources\\templates\\印章\\"+name+".jpg");
        }
        BufferedImage bi = ImageIO.read(file);
        //System.out.println("bg.getWidth():"+bg.getWidth());
        //System.out.println("bg.getHeight():"+bg.getHeight());
        for(int y = bi.getMinY();y<bi.getHeight();y++ ){
            for(int x = bi.getMinX();x<bi.getWidth();x++ ){
                int rbg = bi.getRGB(x,y);
                if(colorInRange(rbg,name)){
                    set(x,y);
                }
            }
        }
        /*System.out.println(minX);
        System.out.println(maxX);
        System.out.println(minY);
        System.out.println(maxY);*/


        for(int y = bi.getMinY();y<bi.getHeight();y++ ){
            for(int x = bi.getMinX();x<bi.getWidth();x++ ){
                if("诚德冷链".equals(name) && (x-170)*(x-170)+(y-165)*(y-165)>160*160){
                    //在印章圆圈内才要去计算
                    continue;
                }
                int rbg = bi.getRGB(x,y);
                if(colorInRange(rbg,name)){
                    int xx = (int)Math.round((x-minX)*缩放比例)+坐标X;
                    int yy = (int)Math.round((y-minY)*缩放比例)+坐标Y;
                    if(xx>bg.getWidth() || yy>bg.getHeight()){
                        continue;
                    }
                    try{
                        if(colorInRange1(bg.getRGB(xx,yy))){
                            //if((xx+yy)%3==0){//三抽一
                            //if((xx+yy)%2==0){//二选一
                            if(Math.random()*3>2){//随机三选一
                                bg.setRGB(xx,yy,rbg);
                            }
                        }else{
                            if("诚德冷链".equals(name)){
                                bg.setRGB(xx,yy,色差补齐(rbg));
                            }else{
                                bg.setRGB(xx,yy,rbg);
                            }
                        }
                    }catch (Exception ex){

                    }

                }
            }
        }
    }

    /**
     * 色差对比（底色为红色）
     * @param color
     * @return
     */
    private static boolean colorInRange(int color,String name){
        int red = (color & 0xff0000) >> 16;// 获取color(RGB)中R位
        int green = (color & 0x00ff00) >> 8;// 获取color(RGB)中G位
        int blue = (color & 0x0000ff);// 获取color(RGB)中B位

        if("阿心航空".equals(name)){
            int g = (int)(Math.random()*20+150);
            int r = 200;
            if((red> r && green<g && blue<g) || (red-green>20 && green-blue<10 && blue<200)){
                return true;
            }
        }
        ///长沙云皓
        /*if(red> 140 && green<150 && blue<160 || (red-green>20 && green-blue<10 && blue<170)){
            return true;
        }*/
        ///恒丰物流
        /*if(red> 140 && green<150 && blue<160 || (red-green>10 && green-blue<10 && blue<166 && green<166)){
            return true;
        }*/
        /*
        晓年物流
        int g = (int)(Math.random()*40+80);
        int r = (int)(Math.random()*20+110);*/

        /*桓垣物流
        int g = (int)(Math.random()*20+100);
        int r = (int)(Math.random()*20+100);*/

        //诚德冷链（印章太暗了）
        if("诚德冷链".equals(name)){
            if((red> 180 || red < 168)){
                return true;
            }
        }
        return false;
    }
    /**
     * 色差对比(底色为黑色)
     * @param color
     * @return
     */
    private static boolean colorInRange1(int color){
        int red = (color & 0xff0000) >> 16;// 获取color(RGB)中R位
        int green = (color & 0x00ff00) >> 8;// 获取color(RGB)中G位
        int blue = (color & 0x0000ff);// 获取color(RGB)中B位

        ///红色印章
        if(red< 150 && green<150 && blue<150){
            return true;
        }
        return false;
    }
    /**
     * 定位文字占位区域
     * @param x
     * @param y
     */
    private static void set(int x,int y){
        if(x<minX){
            minX=x;
        }
        if(x>maxX){
            maxX=x;
        }
        if(y<minY){
            minY=y;
        }
        if(y>maxY){
            maxY=y;
        }
    }

    //诚德的印章太暗，加红
    static int 色差补齐(int color){
        int red = (color & 0xff0000) >> 16;// 获取color(RGB)中R位
        int green = (color & 0x00ff00) >> 8;// 获取color(RGB)中G位
        int blue = (color & 0x0000ff);// 获取color(RGB)中B位
        //System.out.println(red+":"+green+":"+blue);
        String rgb = Integer.toString(red+30, 16)+Integer.toString(green, 16)+Integer.toString(blue, 16);
        int iii = Integer.valueOf(rgb,16);
        return iii;
    }
}
